package com.ocean.core.util;

import io.jsonwebtoken.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;


/**
 * JwtToken工具类
 *
 * @author zhang
 * @date 2020-11-23
 */
public class JwtUtil {

    /**
     * 设置token过期时间、毫秒为单位
     * <p>
     * 12小时
     */
    public static final long EXPIRE = 12 * 60 * 60 * 1000;

    /**
     * 设置token过期时间、毫秒为单位
     * <p>
     * 30天
     */
    public static final long EXPIRE_30 = 24L * 60 * 60 * 1000 * 30;

    /**
     * 密钥
     */
    public static final String APP_SECRET = "015f3-dc1460-d5-cb89c6fc02-ad7db4941";

    private static final Logger log = LoggerFactory.getLogger(JwtUtil.class);

    /**
     * 生成token字符串
     *
     * @param id 用户ID
     * @return token
     */
    public static String generateJwtToken(Object id) {
        log.info("token过期时间：{}", TimeUtil.conversionTime(new Date(System.currentTimeMillis() + EXPIRE)));
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                .setSubject("adminAnyMember")
                //设置过期时间
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                .setId(String.valueOf(id))
                //签名hash
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                .compact();
    }

    /**
     * 生成token字符串
     *
     * @param id 用户ID
     * @return token
     */
    public static String generateJwtTokenLonger(Long id) {
        log.info("token过期时间：{}", TimeUtil.conversionTime(new Date(System.currentTimeMillis() + EXPIRE_30)));
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")
                .setSubject("adminAnyMember")
                //设置过期时间
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE_30))
                .setId(String.valueOf(id))
                //签名hash
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                .compact();
    }

    /**
     * 判断token是否存在与有效
     *
     * @param token token
     * @return boolean
     */
    public static boolean checkToken(String token) {
        if (StringUtil.isNull(token)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(token);
        } catch (ExpiredJwtException e) {
            log.info("token已过期");
            return false;
        } catch (SignatureException | MalformedJwtException e) {
            return false;
        }
        return true;
    }

    /**
     * jwt解密
     *
     * @param token token
     * @return 用户信息
     */
    public static Claims parseJwt(String token) {
        return Jwts.parser()
                .setSigningKey(APP_SECRET)
                .parseClaimsJws(token).getBody();
    }
}